package org.weather;


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

/**
 * Activitatea principală. În ea se află lista cu orașele și prin ea se 
 * accesează celelalte două activități: AddCity și WeatherReport.
 * @author andrei
 *
 */

public class WeatherActivity extends ListActivity implements OnClickListener,
													OnItemLongClickListener{
    private final static String FILE = "cities.txt";
	Button add;
    CityAdapter adapter;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        adapter = new CityAdapter(this);
        /*citim datele salvate pe disc*/
        readFromFile();
      
        setContentView(R.layout.main);
        setListAdapter(adapter);
        
        add = (Button)findViewById(R.id.addCity);
        add.setOnClickListener(this);
        
        getListView().setOnItemLongClickListener(this);
    }
    
    /**
     * Citeste datele salvate pe disc în fișierul FILE.
     */
    private void readFromFile(){
        try {
	    	InputStream in = openFileInput(FILE);
	    	if (in != null) {
		    	BufferedReader reader = 
		    			new BufferedReader(new InputStreamReader(in));
		    	String str;
		    	int i = 0;
		    	while ((str = reader.readLine()) != null) {
		    		adapter.add(str);
		    		i++;
		    	}
		    	
		    	Log.println(Log.DEBUG,"evenimente",
		    			"S-au citit din fisier " + i);
		    	in.close();
	    	}
    	} catch (java.io.FileNotFoundException e) {
    		// încă nu a fost creat fișierul
    	} catch (Throwable t) {
    		Toast.makeText(this, "Exception: " + t.toString(), 2000).show();
    	}
    }
 
    /**
     * La oprirea aplicației sunt salvate datele pe disc.
     */
    public void onStop() {
    	
    	super.onStop();
    	
    	try {
	    	OutputStreamWriter out = 
	    			new OutputStreamWriter(openFileOutput(FILE, MODE_PRIVATE));
	    	
	    	for(int i = 0; i < adapter.getCount(); i++){
	    		out.write(((City)adapter.getItem(i)).name);
	    		out.write("\n");
	    	}
	    	
	    	out.close();
    	} catch (Throwable t) {
    		Toast.makeText(this, 
    				"Exception: " + t.toString(), 2000).show();
    	}
    }
    
    /**
     * La clic lung se sterge un element.
     */
	@Override
	public boolean onItemLongClick(AdapterView<?> listAdapter, 
								   View view, 
								   int pos,
								   long id) {
		adapter.remove(pos);
		Log.println(Log.DEBUG,"evenimente","S-a scos " + pos);
		
		return true;
	}
	
	/**
	 * La clic pe lista se faca un intent care sa activeze WeatherReport.
	 */
    public void onListItemClick (ListView list, View v, int position, long id)
    {
    	/*orasul pe care s-a facut clic*/
        City p = (City)adapter.getItem (position);  
        Intent show = new Intent();
		show.setClass(this, WeatherReport.class);
		/*comunicam activitatii numele orasului*/
		show.putExtra("name", p.name);
		/*asteptam*/
		startActivity(show);
    }

    /**
     * Acesta este metoda ascultatorului butonului. Adauga un oras.
     * Asteapta rezultatul: un string cu orasul.
     */
	@Override
	public void onClick(View v) {
		Intent add = new Intent();
		add.setClass(this, AddCity.class);
		startActivityForResult (add, 100);		
	}
	
	/**
	 * Aici se asteapta rezultatul de la AddCity.
	 */
	@Override
	public void onActivityResult(int requestCode, 
						 		 int responseCode, 
						 		 Intent data){
		
		if((requestCode == 100) && (responseCode == 1)){
			String name = data.getStringExtra("name");
			
			Log.println(Log.DEBUG,"evenimente","S-a adaugat " + name);
			/*Nu are rost sa adaugam duplicate*/
		
			if(name.compareTo("") == 0 || name.startsWith(" ")){
				Toast.makeText(WeatherActivity.this, 
						   "Input should not start with space", 
						   Toast.LENGTH_LONG).show();
				return;
			}
			
			if(adapter.contains(name)){
				Toast.makeText(WeatherActivity.this, 
							   "Already in list", 
							   Toast.LENGTH_LONG).show();
				return;
			}
			
			adapter.add(name);
			
		}
	}
}